//
//  YJModel.m
//  yuanjiang
//
//  Created by YuanJiang on 2019/9/24.
//  Copyright © 2019 llbt. All rights reserved.
//

#import "YJModel.h"
#import <objc/runtime.h>

//NSKeyedUnarchiver 从二进制流读取对象。
//NSKeyedArchiver 把对象写到二进制流中去


@implementation YJModel

// 读取实例变量，并把这些数据写到coder中去。序列化数据
//1）、如果是类 就用encodeObject: forKey：
//2）、如果是普通的数据类型就用 eg、encodeInt： forKey：
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    unsigned int count = 0;
    Ivar *ivarList = class_copyIvarList([self class], &count);
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivarList[i];
        NSString *nameStr = [NSString stringWithUTF8String:ivar_getName(ivar)];
        //利用kvo取出属性对应的值
        id value = [self valueForKey:nameStr];
        //归档
        [aCoder encodeObject:value forKey:nameStr];
    }
    //c语言copy出来的需要进行释放
    free(ivarList);
    
}

//从coder中读取数据，保存到相应的变量中，即反序列化数据
//1）、如果是类 就用decodeObjectForKey：
//2）、如果是普通的数据类型就用 eg、decodeIntForKey：
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        unsigned int count = 0;
        Ivar *ivarList = class_copyIvarList([self class], &count);
        for (int i = 0; i<count; i++) {
            Ivar ivar = ivarList[i];
            NSString *namestr = [NSString stringWithUTF8String:ivar_getName(ivar)];
            id value =[aDecoder decodeObjectForKey:namestr];
            //设置到成员变量身上
            [self setValue:value forKey:namestr];
        }
        free(ivarList);
    }
    return self;
}


@end
